/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxline.service;

import br.com.foxline.atlasmobile.dao.GenericDao;
import br.com.foxline.atlasmobile.enums.TipoDocumento;
import br.com.foxline.enums.Reports;
import br.com.foxline.model.*;
import br.com.foxline.util.Extenso;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.ejb.Stateless;
import javax.faces.context.FacesContext;
import javax.persistence.Query;
import javax.servlet.ServletContext;

/**
 *
 * @author ely
 */
@Stateless
public class ImovelService extends GenericDao<Imovel> {

    public ImovelService() {
        super(Imovel.class);
    }

    @Override
    public void save(Imovel entity) {
        entity.setPagaIptu(entity.getInsetoIptu());
        super.save(entity);
    }

    @Override
    public void update(Imovel entity) {
        entity.setPagaIptu(entity.getInsetoIptu());
        super.update(entity);
    }

    public List<Proprietario> lstProprietario(Imovel imovel) {
        String sql = "SELECT p FROM Imovel i JOIN i.proprietarios p WHERE i.id = :id";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("id", imovel.getId());
        return (List<Proprietario>) query.getResultList();
    }

    public List<Coordenada> lstCoordenadas(Imovel imovel) {
        String sql = "SELECT c FROM Imovel i JOIN i.coordenadas c WHERE i.id  = :id ORDER BY c.id";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("id", imovel.getId());
        return (List<Coordenada>) query.getResultList();
    }

    public List<Annex> lstAnnexs(Imovel imovel) {
        String sql = "SELECT a FROM Imovel i JOIN i.annex a WHERE i.id = :id";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("id", imovel.getId());
        return (List<Annex>) query.getResultList();
    }

    public List<Annex> lstAnnexCroqui(Imovel imovel) {
        String sql = "SELECT a FROM Imovel i JOIN i.annexCroquis a WHERE i.id = :id";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("id", imovel.getId());
        return (List<Annex>) query.getResultList();
    }

    public List<Imovel> findImovel(Imovel imovel) {
        String sql = "SELECT i FROM Imovel i  WHERE i.id = :id";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("id", imovel.getId());
        return (List<Imovel>) query.getResultList();
    }

    public List<Imovel> findImovelProprietario(Proprietario proprietario) {
        String sql = "SELECT i FROM Imovel i JOIN i.proprietarios p WHERE p = :p";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("p", proprietario);
        return (List<Imovel>) query.getResultList();
    }

    public List<Imovel> imovelPendente(String grupo, Bairro bairro, String proprietario, String documentos) {

        String sql = "SELECT i FROM Imovel i ";

        if (bairro != null && bairro.getId() != null) {
            sql += "JOIN i.enderecoImovel ei ";
        }

        sql += " WHERE ";

        if ((proprietario == null || proprietario.equals(""))
                && (documentos == null || documentos.equals(""))) {
            sql += " (i.proprietarios is empty "
                    + "or i.annex is empty) and";
        } else {
            if (proprietario != null && !proprietario.equals("")) {
                sql += "i.proprietarios is empty and ";
            }
            if (documentos != null && !documentos.equals("")) {
                sql += "i.annex is empty and ";
            }
        }

        if (bairro != null && bairro.getId() != null) {
            sql += " lower(ei.bairro) like lower(:bairro) and";
        }

        sql += " i.groupCreate like :groupCreate order by i.groupCreate ASC";

        Query query = getEntityManager().createQuery(sql);
        query.setParameter("groupCreate", "%" + grupo + "%");

        if (bairro != null && bairro.getId() != null) {
            query.setParameter("bairro", "%" + bairro.getNome() + "%");
        }

        return query.getResultList();
    }

    public List<Imovel> imovelPendente(String grupo) {

        String sql = "SELECT i FROM Imovel i "
                + "WHERE (i.proprietarios is empty "
                + "or i.annex is empty "
                + " ) and i.groupCreate like :groupCreate order by i.groupCreate ASC";


        Query query = getEntityManager().createQuery(sql);
//        query.setParameter("p", Patrimonio.UNIAO);
        query.setParameter("groupCreate", "%" + grupo + "%");

        return query.getResultList();
    }

    public List<Imovel> findImoveis(Imovel imovel, Proprietario proprietario, Endereco endereco) {
        List<Imovel> reqs = new ArrayList<Imovel>();

        String sql = "SELECT i FROM Imovel i ";

        if (proprietario != null) {
            if (proprietario.getTipoDocumento() == TipoDocumento.CPF) {
                if ((proprietario.getCpf() != null && !proprietario.getCpf().equals(""))
                        || (!proprietario.getNome().equals("") && proprietario.getNome() != null)) {
                    sql += " JOIN i.proprietarios p ";

                }
            }
            if (proprietario.getTipoDocumento() == TipoDocumento.CNPJ) {
                if ((proprietario.getCnpj() != null && !proprietario.getCnpj().equals(""))
                        || (!proprietario.getNomeFantasia().equals("") && proprietario.getNomeFantasia() != null)) {
                    sql += " JOIN i.proprietarios p ";

                }
            }
        }

        if (endereco != null) {
            if ((!endereco.getCep().equals("") && endereco.getCep() != null)
                    || (endereco.getNumero() != null && !endereco.getNumero().equals(""))
                    || (!endereco.getBairro().equals("") && endereco.getBairro() != null)
                    || (!endereco.getLogradouro().equals("") && endereco.getLogradouro() != null)) {
                sql += " JOIN i.enderecoImovel e ";
            }
        }


        sql += " where ";


//        if ((!realty.getLeaf().equals("") && realty.getLeaf() != null)) {
//            sql += " lower(r.leaf) like lower(:leaf) and ";
//        }


        if (endereco != null) {
            if (endereco.getCep() != null && !endereco.getCep().equals("")) {
                sql += " lower(e.cep) like lower(:cep) and ";
            }
            if (endereco.getNumero() != null && !endereco.getNumero().equals("")) {
                sql += " lower(e.numero) like lower(:numero) and ";
            }
            if (endereco.getLogradouro() != null && !endereco.getLogradouro().equals("")) {
                sql += " lower(e.logradouro) like lower(:logradouro) and ";
            }
            if (endereco.getBairro() != null && !endereco.getBairro().equals("")) {
                sql += " lower(e.bairro) like lower(:bairro) and ";
            }
        }

        if (proprietario != null) {
            if (proprietario.getTipoDocumento() == TipoDocumento.CPF) {
                if ((!proprietario.getCpf().equals("") && proprietario.getCpf() != null)) {
                    sql += " lower(p.cpf) like lower(:cpf) and ";
                }
                if ((!proprietario.getNome().equals("") && proprietario.getNome() != null)) {
                    sql += " lower(p.nome) like lower(:nome) and ";
                }
            }

            if (proprietario.getTipoDocumento() == TipoDocumento.CNPJ) {
                if ((!proprietario.getCnpj().equals("") && proprietario.getCnpj() != null)) {
                    sql += " lower(p.cnpj) like lower(:cnpj) and ";
                }
                if ((!proprietario.getNomeFantasia().equals("") && proprietario.getNomeFantasia() != null)) {
                    sql += " lower(p.nomeFantasia) like lower(:nomeFantasia) and ";
                }
            }
        }

        if (imovel.getInscricaoCadastralD() != null) {
            sql += " i.inscricaoCadastralD = :d and ";
        }
        if (imovel.getInscricaoCadastralS() != null) {
            sql += " i.inscricaoCadastralS = :s and ";
        }
        if (imovel.getInscricaoCadastralQuadra() != null) {
            sql += " i.inscricaoCadastralQuadra = :q and ";
        }
        if (imovel.getInscricaoCadastralLote() != null) {
            sql += " i.inscricaoCadastralLote = :l and ";
        }
        if (imovel.getInscricaoCadastralUnid() != null) {
            sql += " i.inscricaoCadastralUnid = :u and ";
        }
        if (imovel.getInscricaoCadastralLote() != null) {
            sql += " i.inscricaoCadastralLote = :l and ";
        }

        sql += " 1=1 Order by i.id ASC";
        //System.err.print(sql);
        Query query = getEntityManager().createQuery(sql);
        if (proprietario != null) {
            if (proprietario.getTipoDocumento() == TipoDocumento.CPF) {
                if ((!proprietario.getCpf().equals("") && proprietario.getCpf() != null)) {
                    query.setParameter("cpf", proprietario.getCpf());

                }
                if ((!proprietario.getNome().equals("") && proprietario.getNome() != null)) {
                    query.setParameter("nome", "%" + proprietario.getNome() + "%");

                }
            }
            if (proprietario.getTipoDocumento() == TipoDocumento.CNPJ) {
                if ((!proprietario.getCnpj().equals("") && proprietario.getCnpj() != null)) {
                    query.setParameter("cnpj", proprietario.getCnpj());

                }
                if ((!proprietario.getNomeFantasia().equals("") && proprietario.getNomeFantasia() != null)) {
                    query.setParameter("nomeFantasia", "%" + proprietario.getNomeFantasia() + "%");

                }
            }
        }
        if (endereco != null) {
            if ((!endereco.getCep().equals("") && endereco.getCep() != null)) {
                query.setParameter("cep", endereco.getCep());
            }

            if (endereco.getNumero() != null && !endereco.getNumero().equals("")) {
                query.setParameter("numero", "%" + endereco.getNumero() + "%");
            }

            if ((!endereco.getLogradouro().equals("") && endereco.getLogradouro() != null)) {
                query.setParameter("logradouro", "%" + endereco.getLogradouro() + "%");
            }

            if ((!endereco.getBairro().equals("") && endereco.getBairro() != null)) {
                query.setParameter("bairro", "%" + endereco.getBairro() + "%");
            }
        }

        if (imovel.getInscricaoCadastralD() != null) {
            query.setParameter("d", imovel.getInscricaoCadastralD());
        }

        if (imovel.getInscricaoCadastralS() != null) {
            query.setParameter("s", imovel.getInscricaoCadastralS());
        }

        if (imovel.getInscricaoCadastralQuadra() != null) {
            query.setParameter("q", imovel.getInscricaoCadastralQuadra());
        }

        if (imovel.getInscricaoCadastralUnid() != null) {
            query.setParameter("u", imovel.getInscricaoCadastralUnid());
        }
        if (imovel.getInscricaoCadastralLote() != null) {
            query.setParameter("l", imovel.getInscricaoCadastralLote());
        }

        reqs = query.getResultList();
        return reqs;

    }

    public List<Imovel> regImovel(Imovel imovel, Proprietario proprietario, Endereco endereco) {

        String sql = "SELECT i FROM Imovel i";

        if (proprietario != null) {

            if (proprietario.getTipoDocumento() == TipoDocumento.CPF) {
                if ((!proprietario.getCpf().equals("") && proprietario.getCpf() != null)
                        || (!proprietario.getNome().equals("") && proprietario.getNome() != null)) {
                    sql += " JOIN i.proprietarios p ";

                }
            }
            if (proprietario.getTipoDocumento() == TipoDocumento.CNPJ) {
                if ((!proprietario.getCnpj().equals("") && proprietario.getCnpj() != null)
                        || (!proprietario.getNomeFantasia().equals("") && proprietario.getNomeFantasia() != null)) {
                    sql += " JOIN i.proprietarios p ";

                }
            }
        }

        if (endereco != null) {
            if ((!endereco.getCep().equals("") && endereco.getCep() != null)
                    || (!endereco.getBairro().equals("") && endereco.getBairro() != null)
                    || (!endereco.getLogradouro().equals("") && endereco.getLogradouro() != null)) {
                sql += " JOIN i.enderecoImovel e ";
            }
        }
        sql += " where ";
        if (endereco
                != null) {
            if ((!endereco.getCep().equals("") && endereco.getCep() != null)) {
                sql += " lower(e.cep) like lower(:cep) and ";
            }
            if ((!endereco.getLogradouro().equals("") && endereco.getLogradouro() != null)) {
                sql += " lower(e.logradouro) like lower(:logradouro) and ";
            }
            if ((!endereco.getBairro().equals("") && endereco.getBairro() != null)) {
                sql += " lower(e.bairro) like lower(:bairro) and ";
            }
        }

        if (proprietario != null) {
            if (proprietario.getTipoDocumento()
                    == TipoDocumento.CPF) {
                if ((!proprietario.getCpf().equals("") && proprietario.getCpf() != null)) {
                    sql += " lower(p.cpf) like lower(:cpf) and ";
                }
                if ((!proprietario.getNome().equals("") && proprietario.getNome() != null)) {
                    sql += " lower(p.nome) like lower(:nome) and ";
                }
            }

            if (proprietario.getTipoDocumento()
                    == TipoDocumento.CNPJ) {
                if ((!proprietario.getCnpj().equals("") && proprietario.getCnpj() != null)) {
                    sql += " lower(p.cnpj) like lower(:cnpj) and ";
                }
                if ((!proprietario.getNomeFantasia().equals("") && proprietario.getNomeFantasia() != null)) {
                    sql += " lower(p.nomeFantasia) like lower(:nomeFantasia) and ";
                }
            }
        }
        if (imovel.getRegImovel() != null) {
            if (imovel.getRegImovel() == true) {
                sql += " i.regImovel = true and ";
            }
            if (imovel.getRegImovel() == false) {
                sql += " i.regImovel = false and ";
            }
        }

        if (imovel.getPagaIptu()
                != null) {
            if (imovel.getPagaIptu() == true) {
                sql += " i.pagaIptu = true and ";
            }
            if (imovel.getPagaIptu() == false) {
                sql += " i.pagaIptu = false and ";
            }
        }

        if (imovel.getMinhaCasaMinhaVida()
                != null) {
            if (imovel.getMinhaCasaMinhaVida() == true) {
                sql += " i.minhaCasaMinhaVida = true and ";
            }
            if (imovel.getMinhaCasaMinhaVida() == false) {
                sql += " i.minhaCasaMinhaVida = false and ";
            }
        }

        if (imovel.getPatrimonio() != null) {
            sql += " i.patrimonio  =:patrimonio and";
        }

        if (imovel.getComposicaoFamiliar() != null) {
            sql += " i.composicaoFamiliar =:composicao and";
        }


        sql += " 1=1 ";

        System.err.print(sql);
        Query query = getEntityManager().createQuery(sql);

        if (proprietario != null) {
            if (proprietario.getTipoDocumento()
                    == TipoDocumento.CPF) {
                if ((!proprietario.getCpf().equals("") && proprietario.getCpf() != null)) {
                    query.setParameter("cpf", proprietario.getCpf());

                }
                if ((!proprietario.getNome().equals("") && proprietario.getNome() != null)) {
                    query.setParameter("nome", "%" + proprietario.getNome() + "%");

                }
            }

            if (proprietario.getTipoDocumento()
                    == TipoDocumento.CNPJ) {
                if ((!proprietario.getCnpj().equals("") && proprietario.getCnpj() != null)) {
                    query.setParameter("cnpj", proprietario.getCnpj());

                }
                if ((!proprietario.getNomeFantasia().equals("") && proprietario.getNomeFantasia() != null)) {
                    query.setParameter("nomeFantasia", "%" + proprietario.getNomeFantasia() + "%");

                }
            }
        }
        if (endereco
                != null) {
            if ((!endereco.getCep().equals("") && endereco.getCep() != null)) {
                query.setParameter("cep", endereco.getCep());
            }

            if ((!endereco.getLogradouro().equals("") && endereco.getLogradouro() != null)) {
                query.setParameter("logradouro", endereco.getLogradouro());
            }

            if ((!endereco.getBairro().equals("") && endereco.getBairro() != null)) {
                query.setParameter("bairro", endereco.getBairro());
            }
        }
        if (imovel.getPatrimonio() != null) {
            query.setParameter("patrimonio", imovel.getPatrimonio());
        }

        if (imovel.getComposicaoFamiliar() != null) {
            query.setParameter("composicao", imovel.getComposicaoFamiliar());
        }



        return (List<Imovel>) query.getResultList();
    }

    public void reportsAtlasMobileRegImovel(HashMap parametros, Imovel imovel, Proprietario proprietario, Endereco endereco) {
        reportCadastroGeral(parametros, regImovel(imovel, proprietario, endereco));
    }

    public void reportCadastroGeral(HashMap parametros, List<Imovel> regImovel) {

        for (Imovel imovel : regImovel) {
            for (Annex a : imovel.getAnnexCroquis()) {
                InputStream imgInputStream = null;
                System.err.println("I=" + imovel.getId());
                if (a != null) {
                    imgInputStream = new ByteArrayInputStream(a.getFileByte());
                }

                a.setCroquiRelatorio(imgInputStream);
            }
        }

        URL subreport = Thread.currentThread().getContextClassLoader().getResource("br/com/foxline/reports/reportmcmv_subreport1.jasper");
        final String sub = subreport.toString().replace("reportmcmv_subreport1.jasper" + "", "");
        parametros.put("SUBREPORT_DIR", sub);

        FacesContext facesContext = FacesContext.getCurrentInstance();
        ServletContext servletContext = (ServletContext) facesContext.getExternalContext().getContext();


        parametros.put("IMAGE_DIR", servletContext.getRealPath("/media/images/brasao.jpg"));

        ReportService.genReport(parametros, regImovel, Reports.REPORTATLASMOBILE);

    }

    public void reportsMemorialDescritivo(HashMap parametros, Imovel i, Proprietario pro, Endereco e) {
        List<Imovel> regImovel = findImoveis(i, pro, e);

        for (Imovel imovel : regImovel) {
            List<Coordenada> coordenadas = lstCoordenadas(imovel);
            imovel.setCoordenadas(coordenadas);
            List<Proprietario> proprietarios = lstProprietario(imovel);
            imovel.setProprietarios(proprietarios);

            if (imovel.getDimensoes() != null) {
                if (imovel.getDimensoes().getAreaTerreno() != null) {
                    Extenso extenso = new Extenso(imovel.getDimensoes().getAreaTerreno());
                    if (extenso != null) {
                        StringBuffer sbProprietario = new StringBuffer();
                        for (Proprietario p : imovel.getProprietarios()) {
                            sbProprietario.append(p.getNome());
                            sbProprietario.append(" , ");
                        }
                        if (sbProprietario.length() != 0) {
                            sbProprietario.delete(sbProprietario.length() - 3, sbProprietario.length());
                            if (imovel.getProprietarios().size() > 1) {
                                int tam = imovel.getProprietarios().get(imovel.getProprietarios().size() - 1).getNome().length();
                                sbProprietario.replace(sbProprietario.length() - tam - 2, sbProprietario.length() - tam - 1, "e");
                            }
                        }

                        if (imovel.getDimensoes().getPerimetro() != null) {
                            imovel.setPerimeField(String.valueOf(imovel.getDimensoes().getPerimetro() + " m"));
                        } else {
                            imovel.setPerimeField("");
                        }


                        String texto = "";
                        texto = "           Memorial descritivo de um terreno situado no município de Parnaíba, estado"
                                + " do Piaui tendo como proprietário " + sbProprietario + ", localização no bairro " + imovel.getEnderecoImovel().getBairro() + ", zona Urbana da cidade "
                                + "com uma área total de " + extenso.toString() + " metros quadrado " + imovel.getDimensoes().getAreaTerreno() + " m² e um perímetro de " + imovel.getPerimeField() + " com os "
                                + "seguintes limites e confrontações";

                        imovel.setTextoField(texto);
                        imovel.setProprietarioField("" + sbProprietario);


                        if (imovel.getCoordenadas().size() >= 3) {
                            int num = 0;
                            int tam = imovel.getCoordenadas().size();
                            String texto_perimetro = "";
                            texto_perimetro = "           Partindo do vértice ";

                            for (Coordenada c : imovel.getCoordenadas()) {
                                StringBuffer sb = new StringBuffer();
                                sb.append(c.getConvE());
                                if (c == imovel.getCoordenadas().get(0)) {
                                    texto_perimetro += "" + c.getPonto();
                                }

                                texto_perimetro += " com coordenadas UTM E = " + sb.delete(0, 2) + "m e N = " + c.getConvN();
                                texto_perimetro += " e com azimute de " + c.getAzimute() + " e distancia de " + c.getDistancia() + " " + c.getLimite();
//                  
                                if (c != imovel.getCoordenadas().get(tam - 1)) {
                                    texto_perimetro += ", deste ponto segue ";
                                }

                            }
                            texto_perimetro += "; perfazendo assim, uma área de " + extenso.toString() + " metros quadrados " + imovel.getDimensoes().getAreaTerreno()
                                    + " m² e um perímetro de " + imovel.getPerimeField();
                            imovel.setPerimetroField(texto_perimetro);
                            imovel.setTexto_descricao_perimetro("Descrição Perímetro");
                        }

                        if (imovel.getDimensoes().getAreaTerreno() != null) {
                            imovel.setAreaField(String.valueOf(imovel.getDimensoes().getAreaTerreno() + " m²"));
                        } else {
                            imovel.setAreaField("");
                        }

                    }

                } else {


                    StringBuffer sbProprietario = new StringBuffer();
                    for (Proprietario p : imovel.getProprietarios()) {
                        sbProprietario.append(p.getNome());
                        sbProprietario.append(" , ");
                    }
                    if (sbProprietario.length() != 0) {
                        sbProprietario.delete(sbProprietario.length() - 3, sbProprietario.length());
                        if (imovel.getProprietarios().size() > 1) {
                            int tam = imovel.getProprietarios().get(imovel.getProprietarios().size() - 1).getNome().length();
                            sbProprietario.replace(sbProprietario.length() - tam - 2, sbProprietario.length() - tam - 1, "e");
                        }
                    }

                    imovel.setProprietarioField("" + sbProprietario);

                    // Código Perímetro
                    if (imovel.getDimensoes().getPerimetro() != null) {
                        imovel.setPerimeField(String.valueOf(imovel.getDimensoes().getPerimetro() + " m²"));
                    } else {
                        imovel.setPerimeField("");
                    }

                    String texto = "";
                    texto = "           Obs : Esse Imóvel não possue uma área cadastrada, por favor atualizar os dados referentes "
                            + " a área do terreno, Imóvel -> Consulta -> selecione o imóvel clicando em editar, vá na aba de "
                            + "dimensões, digite o dado no campo área do terreno, e clique em salvar.  ";

                    imovel.setTextoField(texto);
                }
            }

            if (imovel.getFrente() != null && !imovel.getFrente().equals("") && imovel.getFrenteRua() != null && !imovel.getFrenteRua().equals("") && imovel.getFrenteMedindo() != null && !imovel.getFrenteMedindo().equals("")) {
                String texto_frente = "Para o " + imovel.getFrente() + " limitando-se com " + imovel.getFrenteRua() + " medindo " + imovel.getFrenteMedindo();
                imovel.setFrenteField(texto_frente);
            } else {
                imovel.setFrenteField("");
            }

            if (imovel.getFundo() != null && !imovel.getFundo().equals("") && imovel.getFundoRua() != null && !imovel.getFundoRua().equals("") && imovel.getFundoMedindo() != null && !imovel.getFundoMedindo().equals("")) {

                String texto_fundo = "Para o " + imovel.getFundo() + " limitando-se com " + imovel.getFundoRua() + " medindo " + imovel.getFundoMedindo();
                imovel.setFundoField(texto_fundo);
            } else {
                imovel.setFundoField("");
            }
            if (imovel.getLadoDireito() != null && !imovel.getLadoDireito().equals("") && imovel.getLadoDireitoRua() != null && !imovel.getLadoDireitoRua().equals("") && imovel.getLadoDireitoMedindo() != null && !imovel.getLadoDireitoMedindo().equals("")) {

                String texto_direito = "Para o " + imovel.getLadoDireito() + " limitando-se com " + imovel.getLadoDireitoRua() + " medindo " + imovel.getLadoDireitoMedindo();
                imovel.setDireitoField(texto_direito);
            } else {
                imovel.setDireitoField("");
            }

            if (imovel.getLadoEsquerdo() != null && !imovel.getLadoEsquerdo().equals("") && imovel.getLadoEsquerdoRua() != null && !imovel.getLadoEsquerdoRua().equals("") && imovel.getLadoEsquerdoMedindo() != null && !imovel.getLadoEsquerdoMedindo().equals("")) {

                String texto_esquerdo = "Para o " + imovel.getLadoEsquerdo() + " limitando-se com " + imovel.getLadoEsquerdo() + " medindo " + imovel.getLadoEsquerdo();
                imovel.setEsquerdoField(texto_esquerdo);
            } else {
                imovel.setEsquerdoField("");
            }
        }

        ReportService.genReport(parametros, regImovel, Reports.TODOSMEMORIAL);

    }

    public void reportMemorial(HashMap parametros, Imovel im) {

        List<Imovel> regImovel = findImovel(im);

        for (Imovel imovel : regImovel) {
            List<Coordenada> coordenadas = lstCoordenadas(imovel);
            imovel.setCoordenadas(coordenadas);
            List<Proprietario> proprietarios = lstProprietario(imovel);
            imovel.setProprietarios(proprietarios);

            if (imovel.getDimensoes() != null) {
                if (imovel.getDimensoes().getAreaTerreno() != null) {
                    Extenso extenso = new Extenso(imovel.getDimensoes().getAreaTerreno());
                    if (extenso != null) {
                        StringBuffer sbProprietario = new StringBuffer();
                        for (Proprietario p : imovel.getProprietarios()) {
                            sbProprietario.append(p.getNome());
                            sbProprietario.append(" , ");
                        }
                        if (sbProprietario.length() != 0) {
                            sbProprietario.delete(sbProprietario.length() - 3, sbProprietario.length());
                            if (imovel.getProprietarios().size() > 1) {
                                int tam = imovel.getProprietarios().get(imovel.getProprietarios().size() - 1).getNome().length();
                                sbProprietario.replace(sbProprietario.length() - tam - 2, sbProprietario.length() - tam - 1, "e");
                            }
                        }

                        if (imovel.getDimensoes().getPerimetro() != null) {
                            imovel.setPerimeField(String.valueOf(imovel.getDimensoes().getPerimetro() + " m"));
                        } else {
                            imovel.setPerimeField("");
                        }


                        String texto = "";
                        texto = "           Memorial descritivo de um terreno situado no município de Parnaíba, estado"
                                + " do Piaui tendo como proprietário " + sbProprietario + ", localização no bairro " + imovel.getEnderecoImovel().getBairro() + ", zona Urbana da cidade "
                                + "com uma área total de " + extenso.toString() + " metros quadrado " + imovel.getDimensoes().getAreaTerreno() + " m² e um perímetro de " + imovel.getPerimeField() + " com os "
                                + "seguintes limites e confrontações";

                        imovel.setTextoField(texto);
                        imovel.setProprietarioField("" + sbProprietario);


                        if (imovel.getCoordenadas().size() >= 3) {
                            int num = 0;
                            int tam = imovel.getCoordenadas().size();
                            String texto_perimetro = "";
                            texto_perimetro = "           Partindo do vértice ";

                            for (Coordenada c : imovel.getCoordenadas()) {
                                StringBuffer sb = new StringBuffer();
                                sb.append(c.getConvE());
                                if (c == imovel.getCoordenadas().get(0)) {
                                    texto_perimetro += "" + c.getPonto();
                                }

                                texto_perimetro += " com coordenadas UTM E = " + sb.delete(0, 2) + "m e N = " + c.getConvN();
                                texto_perimetro += " e com azimute de " + c.getAzimute() + " e distancia de " + c.getDistancia() + " " + c.getLimite();
//                  
                                if (c != imovel.getCoordenadas().get(tam - 1)) {
                                    texto_perimetro += ", deste ponto segue ";
                                }

                            }
                            texto_perimetro += "; perfazendo assim, uma área de " + extenso.toString() + " metros quadrados " + imovel.getDimensoes().getAreaTerreno()
                                    + " m² e um perímetro de " + imovel.getPerimeField();
                            imovel.setPerimetroField(texto_perimetro);
                            imovel.setTexto_descricao_perimetro("Descrição Perímetro");
                        }

                        if (imovel.getDimensoes().getAreaTerreno() != null) {
                            imovel.setAreaField(String.valueOf(imovel.getDimensoes().getAreaTerreno() + " m²"));
                        } else {
                            imovel.setAreaField("");
                        }

                    }

                } else {


                    StringBuffer sbProprietario = new StringBuffer();
                    for (Proprietario p : imovel.getProprietarios()) {
                        sbProprietario.append(p.getNome());
                        sbProprietario.append(" , ");
                    }
                    if (sbProprietario.length() != 0) {
                        sbProprietario.delete(sbProprietario.length() - 3, sbProprietario.length());
                        if (imovel.getProprietarios().size() > 1) {
                            int tam = imovel.getProprietarios().get(imovel.getProprietarios().size() - 1).getNome().length();
                            sbProprietario.replace(sbProprietario.length() - tam - 2, sbProprietario.length() - tam - 1, "e");
                        }
                    }

                    imovel.setProprietarioField("" + sbProprietario);

                    // Código Perímetro
                    if (imovel.getDimensoes().getPerimetro() != null) {
                        imovel.setPerimeField(String.valueOf(imovel.getDimensoes().getPerimetro() + " m²"));
                    } else {
                        imovel.setPerimeField("");
                    }

                    String texto = "";
                    texto = "           Obs : Esse Imóvel não possue uma área cadastrada, por favor atualizar os dados referentes "
                            + " a área do terreno, Imóvel -> Consulta -> selecione o imóvel clicando em editar, vá na aba de "
                            + "dimensões, digite o dado no campo área do terreno, e clique em salvar.  ";

                    imovel.setTextoField(texto);
                }
            }

            if (imovel.getFrente() != null && !imovel.getFrente().equals("") && imovel.getFrenteRua() != null && !imovel.getFrenteRua().equals("") && imovel.getFrenteMedindo() != null && !imovel.getFrenteMedindo().equals("")) {
                String texto_frente = "Para o " + imovel.getFrente() + " limitando-se com " + imovel.getFrenteRua() + " medindo " + imovel.getFrenteMedindo();
                imovel.setFrenteField(texto_frente);
            } else {
                imovel.setFrenteField("");
            }

            if (imovel.getFundo() != null && !imovel.getFundo().equals("") && imovel.getFundoRua() != null && !imovel.getFundoRua().equals("") && imovel.getFundoMedindo() != null && !imovel.getFundoMedindo().equals("")) {

                String texto_fundo = "Para o " + imovel.getFundo() + " limitando-se com " + imovel.getFundoRua() + " medindo " + imovel.getFundoMedindo();
                imovel.setFundoField(texto_fundo);
            } else {
                imovel.setFundoField("");
            }
            if (imovel.getLadoDireito() != null && !imovel.getLadoDireito().equals("") && imovel.getLadoDireitoRua() != null && !imovel.getLadoDireitoRua().equals("") && imovel.getLadoDireitoMedindo() != null && !imovel.getLadoDireitoMedindo().equals("")) {

                String texto_direito = "Para o " + imovel.getLadoDireito() + " limitando-se com " + imovel.getLadoDireitoRua() + " medindo " + imovel.getLadoDireitoMedindo();
                imovel.setDireitoField(texto_direito);
            } else {
                imovel.setDireitoField("");
            }

            if (imovel.getLadoEsquerdo() != null && !imovel.getLadoEsquerdo().equals("") && imovel.getLadoEsquerdoRua() != null && !imovel.getLadoEsquerdoRua().equals("") && imovel.getLadoEsquerdoMedindo() != null && !imovel.getLadoEsquerdoMedindo().equals("")) {

                String texto_esquerdo = "Para o " + imovel.getLadoEsquerdo() + " limitando-se com " + imovel.getLadoEsquerdo() + " medindo " + imovel.getLadoEsquerdo();
                imovel.setEsquerdoField(texto_esquerdo);
            } else {
                imovel.setEsquerdoField("");
            }
        }

        ReportService.genReport(parametros, regImovel, Reports.TODOSMEMORIAL);

    }

    public void reportBillet(byte[] pdfAsBytes) {
        ReportService.genReport(pdfAsBytes);
    }

    public List<Imovel> genMapaImovel() {
        String sql = "SELECT i FROM Imovel i JOIN i.proprietarios p";
        Query query = getEntityManager().createQuery(sql);
        return (List<Imovel>) query.getResultList();
    }

    //DIAGNOSTICO
    public Long diagQtdImovel() {
        String sql = "SELECT count(i.id) FROM Imovel i";
        Query query = getEntityManager().createQuery(sql);
        return (Long) query.getSingleResult();
    }

    public Long diagQtdImovelPorBairro(String bairro) {
        String sql = "SELECT count(i.id) FROM Imovel i JOIN i.enderecoImovel ei "
                + " where lower(ei.bairro) like lower(:bairro) ";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("bairro", bairro);

        return (Long) query.getSingleResult();
    }

    public Long diagQtdImovelPendente() {

        List<Imovel> im = new ArrayList<Imovel>();
        String sql = "SELECT count(i.id) FROM Imovel i "
                + "WHERE i.proprietarios is empty "
                + "or i.annex is empty ";
//                + "or i.patrimonio is Null "
//                + "or (i.patrimonio = :p AND (i.rip is Null or i.rip like '') )";

        Query query = getEntityManager().createQuery(sql);
//        query.setParameter("p", Patrimonio.UNIAO);
        return (Long) query.getSingleResult();
    }

    public Long diagFindImoveis(Imovel imovel, Proprietario proprietario, Endereco endereco) {

        String sql = "SELECT count(i.id) FROM Imovel i ";

        if (proprietario != null) {
            if (proprietario.getTipoDocumento() == TipoDocumento.CPF) {
                if ((proprietario.getCpf() != null && !proprietario.getCpf().equals(""))
                        || (!proprietario.getNome().equals("") && proprietario.getNome() != null)) {
                    sql += " JOIN i.proprietarios p ";

                }
            }
            if (proprietario.getTipoDocumento() == TipoDocumento.CNPJ) {
                if ((proprietario.getCnpj() != null && !proprietario.getCnpj().equals(""))
                        || (!proprietario.getNomeFantasia().equals("") && proprietario.getNomeFantasia() != null)) {
                    sql += " JOIN i.proprietarios p ";

                }
            }
        }

        if (endereco != null) {
            if ((!endereco.getCep().equals("") && endereco.getCep() != null)
                    || (endereco.getNumero() != null && !endereco.getNumero().equals(""))
                    || (!endereco.getBairro().equals("") && endereco.getBairro() != null)
                    || (!endereco.getLogradouro().equals("") && endereco.getLogradouro() != null)) {
                sql += " JOIN i.enderecoImovel e ";
            }
        }


        sql += " where ";

        if (endereco != null) {
            if (endereco.getCep() != null && !endereco.getCep().equals("")) {
                sql += " lower(e.cep) like lower(:cep) and ";
            }
            if (endereco.getNumero() != null && !endereco.getNumero().equals("")) {
                sql += " lower(e.numero) like lower(:numero) and ";
            }
            if (endereco.getLogradouro() != null && !endereco.getLogradouro().equals("")) {
                sql += " lower(e.logradouro) like lower(:logradouro) and ";
            }
            if (endereco.getBairro() != null && !endereco.getBairro().equals("")) {
                sql += " lower(e.bairro) like lower(:bairro) and ";
            }
        }

        if (proprietario != null) {
            if (proprietario.getTipoDocumento() == TipoDocumento.CPF) {
                if ((!proprietario.getCpf().equals("") && proprietario.getCpf() != null)) {
                    sql += " lower(p.cpf) like lower(:cpf) and ";
                }
                if ((!proprietario.getNome().equals("") && proprietario.getNome() != null)) {
                    sql += " lower(p.nome) like lower(:nome) and ";
                }
            }

            if (proprietario.getTipoDocumento() == TipoDocumento.CNPJ) {
                if ((!proprietario.getCnpj().equals("") && proprietario.getCnpj() != null)) {
                    sql += " lower(p.cnpj) like lower(:cnpj) and ";
                }
                if ((!proprietario.getNomeFantasia().equals("") && proprietario.getNomeFantasia() != null)) {
                    sql += " lower(p.nomeFantasia) like lower(:nomeFantasia) and ";
                }
            }
        }

        if (imovel.getInscricaoCadastralD() != null) {
            sql += " i.inscricaoCadastralD = :d and ";
        }
        if (imovel.getInscricaoCadastralS() != null) {
            sql += " i.inscricaoCadastralS = :s and ";
        }
        if (imovel.getInscricaoCadastralQuadra() != null) {
            sql += " i.inscricaoCadastralQuadra = :q and ";
        }
        if (imovel.getInscricaoCadastralLote() != null) {
            sql += " i.inscricaoCadastralLote = :l and ";
        }
        if (imovel.getInscricaoCadastralUnid() != null) {
            sql += " i.inscricaoCadastralUnid = :u and ";
        }
        if (imovel.getInscricaoCadastralLote() != null) {
            sql += " i.inscricaoCadastralLote = :l and ";
        }
        if (imovel.getPatrimonio() != null) {
            sql += " i.patrimonio = :patrimonio and ";
        }

        sql += " 1=1 ";

        Query query = getEntityManager().createQuery(sql);
        if (proprietario != null) {
            if (proprietario.getTipoDocumento() == TipoDocumento.CPF) {
                if ((!proprietario.getCpf().equals("") && proprietario.getCpf() != null)) {
                    query.setParameter("cpf", proprietario.getCpf());

                }
                if ((!proprietario.getNome().equals("") && proprietario.getNome() != null)) {
                    query.setParameter("nome", "%" + proprietario.getNome() + "%");

                }
            }
            if (proprietario.getTipoDocumento() == TipoDocumento.CNPJ) {
                if ((!proprietario.getCnpj().equals("") && proprietario.getCnpj() != null)) {
                    query.setParameter("cnpj", proprietario.getCnpj());

                }
                if ((!proprietario.getNomeFantasia().equals("") && proprietario.getNomeFantasia() != null)) {
                    query.setParameter("nomeFantasia", "%" + proprietario.getNomeFantasia() + "%");

                }
            }
        }
        if (endereco != null) {
            if ((!endereco.getCep().equals("") && endereco.getCep() != null)) {
                query.setParameter("cep", endereco.getCep());
            }

            if (endereco.getNumero() != null && !endereco.getNumero().equals("")) {
                query.setParameter("numero", "%" + endereco.getNumero() + "%");
            }

            if ((!endereco.getLogradouro().equals("") && endereco.getLogradouro() != null)) {
                query.setParameter("logradouro", "%" + endereco.getLogradouro() + "%");
            }

            if ((!endereco.getBairro().equals("") && endereco.getBairro() != null)) {
                query.setParameter("bairro", "%" + endereco.getBairro() + "%");
            }
        }

        if (imovel.getInscricaoCadastralD() != null) {
            query.setParameter("d", imovel.getInscricaoCadastralD());
        }

        if (imovel.getInscricaoCadastralS() != null) {
            query.setParameter("s", imovel.getInscricaoCadastralS());
        }

        if (imovel.getInscricaoCadastralQuadra() != null) {
            query.setParameter("q", imovel.getInscricaoCadastralQuadra());
        }

        if (imovel.getInscricaoCadastralUnid() != null) {
            query.setParameter("u", imovel.getInscricaoCadastralUnid());
        }
        if (imovel.getInscricaoCadastralLote() != null) {
            query.setParameter("l", imovel.getInscricaoCadastralLote());
        }

        if (imovel.getPatrimonio() != null) {
            query.setParameter("patrimonio", imovel.getPatrimonio());
        }

        return (Long) query.getSingleResult();

    }

    public void relatorioPendencia(String grupo) {
        ReportService.genReport(new HashMap<String, Object>(),
                imovelPendente(grupo), Reports.PENDENCIA);
    }

    public void relatorioRelacaoCadastral(HashMap parametros, Imovel i, Proprietario pro, Endereco e) {
        List<Imovel> relacaoImovel = findImoveis(i, pro, e);
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ServletContext servletContext = (ServletContext) facesContext.getExternalContext().getContext();
        parametros.put("IMAGE_DIR", servletContext.getRealPath("/media/images/brasao.jpg"));
        ReportService.genReport(parametros, relacaoImovel, Reports.RELACAO_CADASTRAL);
    }
}
